QT for windows文件夹图标设置

在Windows系统上,我们可以手动设置设置文件夹的图标(属性-自定义-更改图标),一旦设置成功之后,文件夹图标就变了,这是手动操作,本文讲的是如果通过Qt的代码实现它

首先,文件夹图标能改变的原理是,文件夹内含有一个desktop.ini的文件,此文件规定了文件夹的图标及其他属性,本文只讲图标,一个标准的desktop.ini文件如下

[.ShellClassInfo]
IconResource=C:\aaa\bbb.ico,0

同时,文件夹的属性必须是系统文件夹且desktop.ini的属性(属性-详细信息-属性)是系统+隐藏文件(HS)才能使之生效,代码如下

QString icoPath = QStringapplicationDirPath()+ "/aaa/bbb.ico";
QFileInfo fileInfo(icoPath);
QString iniPath = localPath + "/desktop.ini";
QFileInfo iniFileInfo(iniPath);
if(!iniFileInfo.isFile()) {
	QSettings* settings = new QSettings(iniPath , QSettings::IniFormat); // 当前目录的INI文件
	//支持ini文件内的中文
	settings->setIniCodeccodecForName("GB2312");

	settings->beginGroup(".ShellClassInfo");
	settings->setValue("IconResource", icoPath + ",0");
	settings->endGroup();
	delete settings;

	//删去文件中的引号
	QFile file(iniPath);
	QByteArray content;
	ifReadOnly) {
		content = file.readAll();
		file.close();
		ifWriteOnly | QIODevice::Truncate) {
			content.replace("\"", "");
			content.replace("/", "\\");
			file.write(content);
			file.close();
		}
	}

	//设置 desktop.ini 文件属性为系统+隐藏
	SetFileAttributes((LPCWSTR)iniPath.unicode(), FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN);
	//设置文件夹为系统文件夹,这样desktop.ini才能生效
	QProcess::execute(QString("attrib +S \"%1\"").arg(iniFileInfo.path()));
}

需要说明的是,desktop.ini文件内的路径分隔符最好是反斜杠(\),如果路径中有中文,需要设置编码格式为GB2312